#include "stdafx.h"
#include "hnum_slu_mt_machines.h"

#include "hnum_slucmn.h"

namespace harlinn
{
    namespace numerics
    {
        namespace SuperLU
        {

            int sp_ienv(int ispec)
            {
            /*
             * -- SuperLU MT routine (version 1.0) --
             * Univ. of California Berkeley, Xerox Palo Alto Research Center,
             * and Lawrence Berkeley National Lab.
             * August 15, 1997
             *
             *  Purpose   
             *  =======   
             *
             *  sp_ienv() is inquired to choose machine-dependent parameters for the
             *  local environment. See ISPEC for a description of the parameters.   
             *
             *  This version provides a set of parameters which should give good,   
             *  but not optimal, performance on many of the currently available   
             *  computers.  Users are encouraged to modify this subroutine to set   
             *  the tuning parameters for their particular machine using the option   
             *  and problem size information in the arguments.   
             *
             *  Arguments   
             *  =========   
             *
             *  ISPEC   (input) int
             *          Specifies the parameter to be returned as the value of SP_IENV.   
             *          = 1: the panel size w; a panel consists of w consecutive
             *               columns of matrix A in the process of Gaussian elimination.
             *               The best value depends on machine's cache characters.
             *          = 2: the relaxation parameter relax; if the number of
             *               nodes (columns) in a subtree of the elimination tree is less
             *               than relax, this subtree is considered as one supernode,
             *               regardless of the their row structures.
             *          = 3: the maximum size for a supernode;
             *          = 4: the minimum row dimension for 2-D blocking to be used;
             *          = 5: the minimum column dimension for 2-D blocking to be used;
             *          = 6: size of the array to store the values of the L supernodes;
             *               a negative number represents the fills growth factor, i.e.,
             *               the product of its magnitude and the number of nonzeros in the
             *               original A will be used to allocate storage;
             *               a positive number represents the number of nonzeros;
             *          = 7: size of the array to store the columns in U;
             *               a negative number represents the fills growth factor, i.e.,
             *               the product of its magnitude and the number of nonzeros in the
             *               original A will be used to allocate storage;
             *               a positive number represents the number of nonzeros;
             *          = 8: size of the array to store the subscripts of the L supernodes;
             *               a negative number represents the fills growth factor, i.e.,
             *               the product of its magnitude and the number of nonzeros in the
             *               original A will be used to allocate storage;
             *               a positive number represents the number of nonzeros;
             *   
             * (SP_IENV) (output) int
             *          >= 0: the value of the parameter specified by ISPEC   
             *          < 0:  if SP_IENV = -k, the k-th argument had an illegal value. 
             *
             *  ===================================================================== 
             */
                int i;

                switch (ispec) {

            #if ( MACH==SGI )
	            case 1: return (20);
	            case 2: return (6);
	            case 3: return (100);
	            case 4: return (800);
	            case 5: return (100);
            #elif ( MACH==ORIGIN ) 
	            case 1: return (12);
	            case 2: return (6);
	            case 3: return (100);
	            case 4: return (400);
	            case 5: return (100);
            #elif ( MACH==DEC )
	            case 1: return (16);
	            case 2: return (6);
	            case 3: return (50);
	            case 4: return (100);
	            case 5: return (40);
            #elif ( MACH==CRAY_PVP )
	            case 1: return (1);
	            case 2: return (6);
	            case 3: return (64);
	            case 4: return (400);
	            case 5: return (200);
            #elif ( MACH==SUN )
	            case 1: return (8);
	            case 2: return (6);
	            case 3: return (100);
	            case 4: return (400);
	            case 5: return (40);
            #else
	            case 1: return (20);
	            case 2: return (6);
	            case 3: return (200);
	            case 4: return (200);
	            case 5: return (100);
            #endif
                    case 6: return (-50);
                    case 7: return (-50);
                    case 8: return (-30);
                }

                /* Invalid value for ISPEC */
                i = 1;
                xerbla_("sp_ienv", &i);
                return 0;

            } /* sp_ienv_ */

        };
    };
};